package com.softWang.system.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.softWang.common.base.BaseServiceMy;
import com.softWang.common.exception.LogicException;
import com.softWang.system.constants.CacheNameConstant;
import com.softWang.system.mapper.SystemParameterMapper;
import com.softWang.system.controller.vo.systemParameter.SystemParameterQueryAllParam;
import com.softWang.system.controller.vo.systemParameter.SystemParameterQueryAllResult;
import com.softWang.system.po.SystemParameter;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Service
public class SystemParameterService extends BaseServiceMy<SystemParameter> {
    @Resource
    private SystemParameterMapper systemParameterMapper;

    /**
     * 分页条件查询
     * @param param
     * @return
     */
    public List<SystemParameterQueryAllResult> queryall(SystemParameterQueryAllParam param){
        param.startPage();
        List<SystemParameterQueryAllResult> results=systemParameterMapper.queryall(param);
        return results;
    }

    /**
     * 插入参数
     * @param param 参数信息
     * @return 参数id
     */
    @Transactional
    public Long add(SystemParameter param) {
        // 验证参数信息
        valdation(param);
        // 设置参数信息
        param.setState(SystemParameter.State.NORMAL.getCode());

        systemParameterMapper.insert(param);

        return param.getId();
    }


    /**
     * 修改参数
     * @param param     *
     * @return
     */
    //@CacheEvict(value = CacheNameConstant.SYSTEM_PARAMETER_CACHE,  key = "'SYS_PARAM_' + #param.id")
    @CacheEvict(value = CacheNameConstant.SYSTEM_PARAMETER_CACHE,allEntries = true)
    @Transactional
    public Long edit(SystemParameter param) {
        // 验证参数信息
        valdation(param);
        systemParameterMapper.updateById(param);

        return param.getId();
    }

    /**
     * 获取详情
     * @param id id
     * @return 部门信息
     */
    //@Cacheable(value = CacheNameConstant.SYSTEM_PARAMETER_CACHE, key = "'SYS_PARAM_' + #id")
    public SystemParameter getById(Long id) {
        return systemParameterMapper.selectById(id);
    }

    /**
     * 删除
     * @param ids id列表
     * @return void
     */
    @CacheEvict(value = CacheNameConstant.SYSTEM_PARAMETER_CACHE,allEntries = true)
    @Transactional
    public void del(List<Long> ids) {
        //删除部门
        systemParameterMapper.deleteBatchIds(ids);
    }


    private void valdation(SystemParameter param){
        // 验证名称唯一性
        Long num = systemParameterMapper.selectCount(
                new LambdaQueryWrapper<SystemParameter>()
                        .eq(SystemParameter::getPname, param.getPname())
                        .ne(param.getId()!=null,SystemParameter::getId, param.getId()));
        if (num > 0) {
            throw new LogicException("名称已存在!");
        }
        // 验证Key唯一性
        Long keyNum = systemParameterMapper.selectCount(
                new LambdaQueryWrapper<SystemParameter>()
                        .eq(SystemParameter::getPkey, param.getPkey())
                        .ne(param.getId()!=null,SystemParameter::getId, param.getId()));
        if (keyNum > 0) {
            throw new LogicException("键名已存在!");
        }
    }

    @Cacheable(value = CacheNameConstant.SYSTEM_PARAMETER_CACHE, key = "'SYS_PARAM_' + #key")
    public SystemParameter getByKey(String key) {
        return systemParameterMapper.selectOne(new LambdaQueryWrapper<SystemParameter>()
               .eq(SystemParameter::getPkey, key));
    }
}
